#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <vector>
#include <QLabel>
#include <QPushButton>
#include <QMenu>
#include <QAction>
#include <QInputDialog>
#include <QFormLayout>
#include <QDialog>
#include <QLineEdit>
#include <QIntValidator>
#include <QLCDNumber>
#include <QGroupBox>
#include <QSettings>

#include "BlobAnalysis.h"
#include "threadmanager.h"

QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

    // 初始化界面
    void initMainwindow();
    // 初始化信号槽
    void initSlots();
    // 加载设置
    void loadSettings();
    // 保存设置
    void saveSettings();

protected:
    // 用于根据窗口大小调整界面的字体
    void resizeEvent(QResizeEvent *event) override;
    // 重写关闭事件，用于保存设置
    void closeEvent(QCloseEvent *event) override;

private slots:
    // 处理线程完成信号
    void onImageProcessed(const ProcessResult& result);
    // 处理线程错误信号
    void onProcessError(const QString& errorMessage);
    // 点击暂停按钮
    void onPauseButtonClicked();
    // 点击开始按钮
    void onKeepButtonClicked();
    // 队列已满，弹窗提醒
    void onQueueFull();
    // 图片总数
    void onTotalCount(const int count);
    // 点击上一张按钮
    void onPrevButtonClicked();
    // 点击下一张按钮
    void onNextButtonClicked();
    // 模式切换按钮点击
    void onModeButtonClicked();
    // 状态栏显示超过上限提醒
    void onLimitExceeded();
    // 处理计数更新信号
    void onCountUpdated(const CountResult& result);
    // 处理倒计时信号
    void onStartCountdown(int seconds);
    // 处理定时器
    void onTimeout();
    // 点击countLabel设置上限
    void onCountLabelClicked();
    // 修改上限值相关槽函数
    void onTotalModBtn();
    void onLeftModBtn();
    void onRightModBtn();
    void onTotalSubBtn();
    void onLeftSubBtn();
    void onRightSubBtn();

private:
    // 显示内容
    void displayResults(const ProcessResult &result);
    // 更新按钮状态
    void updateButtonStates(bool isPaused);
    // 更新模式显示
    void updateModeDisplay();
    // 设置整体个数上限
    void setTotalLimit();
    // 设置左右个数上限
    void setLeftRightLimit();

private:
    Ui::MainWindow *ui;
    ThreadManager* threadManager_;      // 线程管理对象
    QString path_;                      // 图片文件夹路径
    int totalCount_;                    // 图片总数量
    int currIndex_;                     // 当前显示的图片索引
    bool isPaused_;                     // 是否是暂停状态
    int baseFontSize_;                  // 基准字体大小，根据窗口大小调整字体
    int countMode_;                     // 当前统计模式 0: 整体统计, 1: 左右侧分别统计
    int totalLimit_;                    // 整体个数上限
    int leftLimit_;                     // 左侧个数上限
    int rightLimit_;                    // 右侧个数上限
    int totalNum_;                      // 当前的总个数
    int leftNum_;                       // 当前的左侧个数
    int rightNum_;                      // 当前的右侧个数
    QLCDNumber* countdownLcd_;          // 倒计时控件
    QTimer* timer_;                     // 倒计时定时器
    QLabel* statusLabel_;               // 状态标签，显示当前第几张
    QLabel* imageLabel_;                // 图片标签，显示图片
    QLabel* showLabel_;                 // 显示标签，显示周长、面积
    QLabel* modeLabel_;                 // 模式显示标签，显示当前模式
    QLabel* countLabel_;                // 数量显示标签，显示当前个数和上限个数
    QLabel* countdownLabel_;            // 倒计时标签

    QLabel* totalLimitTag_;             // 整体上限标签
    QLabel* leftLimitTag_;              // 左侧上限标签
    QLabel* rightLimitTag_;             // 右侧上限标签
    QLineEdit* totalLineEdit_;          // 整体上限输入框
    QLineEdit* leftLineEdit_;           // 左侧上限输入框
    QLineEdit* rightLineEdit_;          // 右侧上限输入框
    QLabel* totalLimitLabel_;           // 整体上限数值显示
    QLabel* leftLimitLabel_;            // 左侧上限数值显示
    QLabel* rightLimitLabel_;           // 右侧上限数值显示
    QPushButton* totalModBtn_;          // 整体上限修改按钮
    QPushButton* leftModBtn_;           // 左侧上限修改按钮
    QPushButton* rightModBtn_;          // 右侧上限修改按钮
    QPushButton* totalSubBtn_;          // 整体上限提交按钮
    QPushButton* leftSubBtn_;           // 左侧上限提交按钮
    QPushButton* rightSubBtn_;          // 右侧上限提交按钮

    QPushButton* prevButton_;           // 上一张按钮
    QPushButton* nextButton_;           // 下一张按钮
    QPushButton* pauseButton_;          // 暂停按钮
    QPushButton* keepButton_;           // 继续按钮
    QPushButton* modeButton_;           // 模式切换按钮
    QGroupBox* contourGroupBox_;        // 轮廓groupBox
    QGroupBox* countResultGroupBox_;    // 计数结果groupBox
    QGroupBox* periAreaGroupBox_;       // 周长面积groupBox
    QHBoxLayout* limitRowLayout1;
    QHBoxLayout* limitRowLayout2;
    QHBoxLayout* limitRowLayout3;
};
#endif // MAINWINDOW_H
